从传统PDA到手机当扫码枪小程序,一套高可用轻量级编码解码技术全揭秘
干了快十年企业数字化集成,我经手过的条码项目少说也有上百个。早些年进仓库或者商超盘点,大家腰上别个PDA(工业手持终端),砰砰扫货,那玩意儿皮实是皮实,但弊端也明摆着:单价两三千起步,系统大多是WinCE或者老安卓,想加个新字段得找原厂二次开发,周期按月计。我们团队在2019年接了个华东区连锁药房的单子,客户抱怨PDA报废率高、充电座老丢,就随口问了句——现在人人手机像素都这么高了,能不能直接用手机扫,省掉专门设备?
这句话成了我们后来两年折腾“手机变扫码枪”方案的起点。但真做起来才知道,把消费级手机当成工业扫码枪用,远不是调个微信小程序相机接口那么轻松。
手机摄像头面对的现实环境比PDA苛刻得多。仓库里灯光昏黄、条码脏污磨损、包裹叠压导致条码变形,这些在专用激光头面前不是事儿,在手机镜头里就成了识别杀手。更麻烦的是业务数据回传:传统PDA有专门的内网通道,而手机依赖公网Wi-Fi或4G,信号死角随时可能断链。我们要解决的核心,是一套高可用且轻量级的编码解码技术,让手机在小程序里既能扫得快、认得准,又能在弱网甚至断网时不出错。
先说编码端。很多团队图省事,直接把业务数据拼成JSON字符串塞进二维码。这在演示环境没问题,实际现场打印的条码密度一高,手机就只能拉远了扫,效率骤降。我们借鉴了Protocol Buffers的思路,自研了一套紧凑二进制编码协议,把商品SKU、批次、数量等字段做变长整型压缩,再配合前向纠错码(FEC)。实测同样信息量,我们的码图面积比纯文本QR码小了近60%,这意味着手机可以在离条码更近、视角更歪的情况下完成捕捉。
解码侧才是真战场。一开始我们用的是开源ZXing的JS移植版,在低端机上解码延迟能到800毫秒,流水线直接堵死。后来我们狠下心,把核心图像处理和解码算法用C 重写,编译成WebAssembly模块塞进小程序。配合针对性的二值化算法(不是全局阈值,而是基于条码区域纹理的动态局部阈值),在红米千元机上也能做到120毫秒内出结果,准确率99.97%。这套组合拳我们内部叫“轻核解码”,体积才280KB,不占手机存储空间。顺便说一句,微信原生扫码组件其实也能出结果,但它是黑盒,没法植入我们的动态二值化和FEC校验逻辑,而且频繁调起耗时明显。我们最终用小程序的camera上下文拿视频帧,自行管流水线,虽然开发量大,但把主动权攥在了自己手里。
高可用怎么保障?这里有个坑必须提一嘴。起初我们认为扫码成功就立即POST数据,结果客户仓库角落信号差,明明扫了码,后台没收到,盘点和实际对不上。我们改成小程序端本地队列缓存,采用类似MQ的确认重传机制:扫码数据先落本地IndexedDB,网络通了按序补传,并且服务端做幂等校验。哪怕工人走进电梯断了网,出来后数据自动补齐,业务零感知。
去年双十一,那家药房客户全面撤掉了300多台PDA,一线员工全用自己手机装个小程序上岗。整个大促期间处理的扫码量破千万条,系统错误率控制在十万分之一以下,对比之前PDA时代万分之五的误扫漏扫,提升不是一点半点。算上设备折旧和省下的流量卡费用,半年帮他们省了四十多万。
技术更替的魅力就在这儿。从笨重的传统PDA到人人必备的手机,中间隔着的不是简单的“摄像头权限”,而是对编码效率、解码性能和无网高可用的死磕。如果你也在琢磨低成本改造现场采集流程,或许这套轻量级方案能给你些启发。
微信号:18581869297